﻿using log4net;
using MSWeb.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web.Mvc;

namespace MSDAL.Implementation
{
    public class LessonRepository
    {
        readonly ILog loger = LogManager.GetLogger(typeof(LessonRepository));
        private readonly MSEntities _db;

        public LessonRepository()
        {
            _db = new MSEntities();
        }
        
        public IEnumerable<SelectListItem> GetOpenedLessonsForTeacher()
        {
            IList<SelectListItem> items = new List<SelectListItem>();
            _db.Lekcje.Where(i => i.WyplataId == null)
                .Where(i => i.CzyZatwierdzona == true && i.WyplataId == null
                    && i.CzyUsunieta != false)
                .ToList().ForEach(item =>
            {
                items.Add(new SelectListItem
                {
                    Text = item.Data + " " + item.Nauczyciele.Imie + " " + item.Nauczyciele.Nazwisko + " " + item.WynagrodzenieNauczyciela.ToString() + " PLN",
                    Value = item.IDLekcji.ToString()
                });
            });
            return items;
        }

        public IEnumerable<SelectListItem> GetOpenedLessons()
        {
            IList<SelectListItem> items = new List<SelectListItem>();
            _db.Lekcje
                .Where(i => i.WplataId == null && i.CzyZatwierdzona == true && i.CzyUsunieta != false)
                .ToList().ForEach(item =>
            {
                items.Add(new SelectListItem
                {
                    Text = item.Data + " " + item.Uczniowie.Imie + " " + item.Uczniowie.Nazwisko + " " + item.KosztLekcji.ToString() + " PLN",
                    Value = item.IDLekcji.ToString()
                });
            });
            return items;
        }

        public void ConfirmLessons(DateTime data)
        {
            var res = _db.Lekcje
                    .Include(l => l.Nauczyciele)
                    .Include(l => l.Sale)
                    .Include(l => l.Uczniowie)
                    .Where(i => i.Data.Value.Year == data.Date.Year
                    && i.Data.Value.Month == data.Date.Month
                    && i.Data.Value.Day == data.Date.Day)
                    .Where(i=>i.CzyUsunieta == false)
                    .ToList();
            foreach (var item in res)
            {
                item.CzyZatwierdzona = true;
                _db.Entry(item).State = EntityState.Modified;
                _db.SaveChanges();
            }
        }

        public bool SaveNewLesson(NewLessonViewModel lekcje)
        {
            try
            {
                var lekcjaDoDodania = new Lekcje
                {
                    IDUcznia = lekcje.IDUcznia,
                    IDNauczyciela = lekcje.IDNauczyciela,
                    Data = lekcje.Data,
                    Sale = lekcje.Sale,
                    IDSali = lekcje.IDSali,
                    CzyZatwierdzona = false,
                    KosztLekcji = lekcje.CenaLekcjiUcznia,
                    CzyUsunieta = false,
                    CzyUczenL4 = lekcje.CzyUczenL4,
                    CzasTrwaniaLekcji = lekcje.CzasTrwaniaLekcji,
                    WynagrodzenieNauczyciela = lekcje.CenaLekcjiNauczyciela,
                    IDPowtorzenia = lekcje.IdPowtorzenia
                };
                _db.Lekcje.Add(lekcjaDoDodania);
                _db.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                loger.Error("Error ", ex);
                return false;
            }
        }


        public bool DeleteLesson(int id)
        {
            try
            {
                var lekcjaDoUsuniecia = _db
                    .Lekcje
                    .Find(id);
                lekcjaDoUsuniecia.CzyUsunieta = true;
                _db.Entry(lekcjaDoUsuniecia).State = EntityState.Modified;
                _db.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                loger.Error("Error ", ex);
                return false;
            }
        }

        public double GetPaymentForTeacherBasedOnLessonId(int lessonId)
        {
            var result = _db
                .Lekcje
                .First(i => i.IDLekcji == lessonId)
                .WynagrodzenieNauczyciela;
            return result ?? 0;
        }

        public double GetPaymentForStudentBasedOnLessonId(int lessonId)
        {
            var result = _db
                .Lekcje
                .First(i => i.IDLekcji == lessonId)
                .KosztLekcji;
            return result ?? 0;
        }

        public double GetSumTeacherPayment(List<int> lessons)
        {
            double result = 0;
            foreach (var item in lessons)
            {
                result += GetPaymentForTeacherBasedOnLessonId(item);
            }
            return result;
        }

        public double GetSumStudentPayment(List<int> lessons)
        {
            double result = 0;
            foreach (var item in lessons)
            {
                result += GetPaymentForStudentBasedOnLessonId(item);
            }
            return result;
        }
    }
}
